﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Resources;
using System.Web;
using vudu.Logica.Clases;

namespace vudu.EnlaceDatos.SqlServer
{
    /// <summary>
    /// Clase que contiene los metodos basicos para el caso de uso de gestionar evaluacion
    /// (Agregar,Modificar,Eliminar,Consultar)
    /// </summary>
    public class SqlServerEvaluacion
    {
        /// <summary>
        /// Este metodo inserta una evaluacion a la base de datos
        /// </summary>
        /// <returns>retorna un int con el cliente insertado</returns>
        public int InsertarEvaluacion(Evaluacion evaluacion)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[InsertarEvaluacion]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@tipoEvaluacion", evaluacion.TipoEvaluacion);
                command.Parameters.AddWithValue("@nombreEvaluacion", evaluacion.Nombre);
                command.Parameters.AddWithValue("@porcentajeEvaluacion", evaluacion.Porcentaje);
                command.Parameters.AddWithValue("@fechaTentativaEvaluacion", evaluacion.FechaEvaluacion);
                command.Parameters.AddWithValue("@fk_id_seccion", evaluacion.FkIdSeccion);
                command.Parameters.AddWithValue("@idInsertado", SqlDbType.Int);

                command.Parameters["@tipoEvaluacion"].Direction = ParameterDirection.Input;
                command.Parameters["@nombreEvaluacion"].Direction = ParameterDirection.Input;
                command.Parameters["@porcentajeEvaluacion"].Direction = ParameterDirection.Input;
                command.Parameters["@fechaTentativaEvaluacion"].Direction = ParameterDirection.Input;
                command.Parameters["@fk_id_seccion"].Direction = ParameterDirection.Input;
                command.Parameters["@idInsertado"].Direction = ParameterDirection.Output;

                //se ejecuta el comando
                command.ExecuteReader();
                //se lee la variable de tipo output para saber que id fue insertado en base de datos.
                int idInsertado = (int)command.Parameters["@idInsertado"].Value;

                return idInsertado;
            }
            catch (Exception e)
            {
                throw new Exception("Error en la conexion");
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally 
            {
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Este metodo consulta una evaluacion en la base de datos
        /// </summary>
        /// <returns>retorna un objeto de tipo evaluacion</returns>
        public Evaluacion ConsultarEvaluacion(int idEvaluacion)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarEvaluacion]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idEvaluacion", idEvaluacion);
                command.Parameters["@idEvaluacion"].Direction = ParameterDirection.Input;
                //se ejecuta el comando
                //se carga la informacion consultada en un objeto de tipo Evaluacion
                Evaluacion evaluacionConsultada = new Evaluacion();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    evaluacionConsultada.IdEvaluacion = reader.GetInt32(0);
                    evaluacionConsultada.TipoEvaluacion = reader.GetString(1);
                    evaluacionConsultada.Nombre = reader.GetString(2);
                    evaluacionConsultada.Porcentaje = reader.GetInt32(3);
                    evaluacionConsultada.FechaEvaluacion = reader.GetDateTime(4);
                    evaluacionConsultada.FkIdSeccion = reader.GetInt32(5);
                }
                return evaluacionConsultada;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception)
            {
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Este metodo elimina una evaluacion en la base de datos
        /// </summary>
        /// <returns>retorna un boleano en true si lo elimino y falso en el caso contrario</returns>
        public bool EliminarEvaluacion(Evaluacion evaluacion)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[EliminarEvaluacion]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idEvaluacion", evaluacion.IdEvaluacion);
                command.Parameters["@idEvaluacion"].Direction = ParameterDirection.Input;
                //se ejecuta el comando
                command.ExecuteReader();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception e)
            {
                return false;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Este metodo modifica una evaluacion en la base de datos
        /// </summary>
        /// <returns>retorna un boleano en true si lo modifico y falso en el caso contrario</returns>
        public bool ModificarEvaluacion(Evaluacion evaluacion)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ModificarEvaluacion]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.

                command.Parameters.AddWithValue("@idEvaluacion", evaluacion.IdEvaluacion);
                command.Parameters.AddWithValue("@tipoEvaluacion", evaluacion.TipoEvaluacion);
                command.Parameters.AddWithValue("@nombreEvaluacion", evaluacion.Nombre);
                command.Parameters.AddWithValue("@porcentajeEvaluacion", evaluacion.Porcentaje);
                command.Parameters.AddWithValue("@fechaTentativaEvaluacion", evaluacion.FechaEvaluacion);

                command.Parameters["@idEvaluacion"].Direction = ParameterDirection.Input;
                command.Parameters["@tipoEvaluacion"].Direction = ParameterDirection.Input;
                command.Parameters["@nombreEvaluacion"].Direction = ParameterDirection.Input;
                command.Parameters["@porcentajeEvaluacion"].Direction = ParameterDirection.Input;
                command.Parameters["@fechaTentativaEvaluacion"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                command.ExecuteReader();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception e)
            {
                return false;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Este metodo consulta en base de datos los esquemas de evaluacion de un profesor.
        /// </summary>
        /// <param name="profesor">informacion del profesor que se le va a consultar los esquemas de evaluacion</param>
        /// <returns>Retorna una lista con los esquemas de evaluacion del profesor.</returns>
        public List<SeccionMateria> ConsultarEsquemasDeEvaluacionProfesor(Profesor profesor)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarEsquemasEvaluacionProfesor]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idProfesor", profesor.Cedula);
                command.Parameters["@idProfesor"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                //se carga la informacion consultada en un objeto de tipo Evaluacion
                List<SeccionMateria> esquemasEvaluacion = new List<SeccionMateria>();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccionMateria = new SeccionMateria();
                    seccionMateria.IdSeccionMateria = reader.GetInt32(0);
                    seccionMateria.Codigo = reader.GetInt32(1);
                    seccionMateria.Materia.Nombre = reader.GetString(2);
                    esquemasEvaluacion.Add(seccionMateria);

                }
                return esquemasEvaluacion;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Este metodo consulta en base de datos los esquemas de evaluacion de una seccion.
        /// </summary>
        /// <param name="seccionMateria">informacion de la seccion que se le va a consultar los esquemas de evaluacion</param>
        /// <returns>Retorna una lista con las evaluaciones de la seccion.</returns>
        public List<Evaluacion> ConsultarEsquemaEvaluacionSeccion(SeccionMateria seccionMateria)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarEsquemaEvaluacionSeccion]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idSeccion", seccionMateria.IdSeccionMateria);

                command.Parameters["@idSeccion"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                //se carga la informacion consultada en un objeto de tipo Evaluacion
                List<Evaluacion> esquemaEvaluacion = new List<Evaluacion>();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Evaluacion evaluacion = new Evaluacion();
                    evaluacion.Nombre = reader.GetString(0);
                    evaluacion.Porcentaje = reader.GetInt32(1);
                    evaluacion.FechaEvaluacion = reader.GetDateTime(2);
                    evaluacion.TipoEvaluacion = reader.GetString(3);
                    evaluacion.IdEvaluacion = reader.GetInt32(4);
                    esquemaEvaluacion.Add(evaluacion);

                }
                return esquemaEvaluacion;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Este metodo consulta en base de datos los esquemas de evaluacion de un profesor, que no tengan cargadas notas.
        /// </summary>
        /// <param name="profesor">informacion del profesor que se le va a consultar los esquemas de evaluacion</param>
        /// <returns>Retorna una lista con los esquemas de evaluacion del profesor, que no tengan notas cargadas.</returns>
        public List<SeccionMateria> ConsultarEsquemasDeEvaluacionSinNotasProfesor(Profesor profesor)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarEsquemasEvaluacionSinNotasProfesor]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idProfesor", profesor.Cedula);
                command.Parameters["@idProfesor"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                //se carga la informacion consultada en un objeto de tipo Evaluacion
                List<SeccionMateria> esquemasEvaluacion = new List<SeccionMateria>();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccionMateria = new SeccionMateria();
                    seccionMateria.IdSeccionMateria = reader.GetInt32(0);
                    seccionMateria.Codigo = reader.GetInt32(1);
                    seccionMateria.Materia.Nombre = reader.GetString(2);
                    esquemasEvaluacion.Add(seccionMateria);

                }
                return esquemasEvaluacion;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Este metodo elimina un esquema de evaluacion en la base de datos
        /// </summary>
        /// <returns>retorna un boleano en true si lo elimino y falso en el caso contrario</returns>
        public bool EliminarEsquemaEvaluacion(SeccionMateria seccionMateria)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[EliminarEsquemaEvaluacion]";
                command.CommandTimeout = 10;
                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@idSeccion", seccionMateria.IdSeccionMateria);
                command.Parameters["@idSeccion"].Direction = ParameterDirection.Input;
                //se ejecuta el comando
                command.ExecuteReader();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception e)
            {
                return false;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Este metodo consulta en base de datos los esquemas de evaluacion de un estudiante.
        /// </summary>
        /// <param name="estudiante">informacion del estudiante que se le va a consultar los esquemas de evaluacion</param>
        /// <returns>Retorna una lista con los esquemas de evaluacion del estudiante.</returns>
        public List<SeccionMateria> ConsultarEsquemasEvaluacionEstudiante(Estudiante estudiante)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            try
            {
                //se abre una conexion a base de datos
                miConexion.AbrirConexionBd();
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarEsquemasEvaluacionEstudiante]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@cedulaEstudiante", estudiante.Cedula);
                command.Parameters["@cedulaEstudiante"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                //se carga la informacion consultada en un objeto de tipo Evaluacion
                List<SeccionMateria> esquemasEvaluacion = new List<SeccionMateria>();
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    SeccionMateria seccionMateria = new SeccionMateria();
                    seccionMateria.IdSeccionMateria = reader.GetInt32(1);
                    seccionMateria.Materia.Nombre = reader.GetString(2);
                    seccionMateria.Profesor.Nombre = reader.GetString(3);
                    seccionMateria.Codigo = reader.GetInt32(4);
                    esquemasEvaluacion.Add(seccionMateria);

                }
                return esquemasEvaluacion;
            }
            catch (SqlException)
            {
                return null;
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.StackTrace);
                System.Console.ReadLine();
                return null;
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                if (reader != null)
                    reader.Close();
                miConexion.CerrarConexionBd();
            }
        }
    }
}